package cn.tedu.knows.gateway.aspect;

import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.statement.select.Join;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//@Aspect表示当前类是一个通知类
//其中的方法专门为在某些方法之前后之后运行而设计编写
@Aspect
@Component
@Slf4j
public class AopAspect {

    //声明切入点
    @Pointcut("execution(public * " +
            "cn.tedu.knows.gateway.controller.AopController.test(..))")
    public void pointCut(){}
    //上面的方法,不需要方法体,实际上仅仅是
    // 定义了一个切入点的名称为pointCut
    // 下面就可以额使用pointCut作为切入点进行advice了


    //进行前置通知的代码增强,目标就是上面的切入点指定的方法
    @Before("pointCut()")
    public void before(JoinPoint joinPoint){
        Signature method=joinPoint.getSignature();
        log.info("前置运行,方法信息:{}",method);
    }
    @After("pointCut()")
    public void after(JoinPoint joinPoint){
        Signature method=joinPoint.getSignature();
        log.info("后置运行,方法信息:{}",method);
    }

    @AfterThrowing("pointCut()")
    public void afterThrowing(JoinPoint joinPoint){
        Signature method=joinPoint.getSignature();
        log.info("出现异常,方法信息:{}",method);
    }

    //ProceedingJoinPoint 参数转用于环绕增强
    //它是JoinPoint的子类,扩展了环绕增强需要的方法
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint)
            throws Throwable {
        log.info("环绕增强前置");
        //运行目标方法
        Object ret=joinPoint.proceed();
        log.info("环绕增强后置");
        return ret;
    }





}
